package com.cskaoyan.javase.object._3equals;

/**
 * equals方法实现排它性时的两个选择:
 *      1.getClass来做排它性校验.
 *          只要不是同种类型,一律返回false,不关心其他任何条件
 *
 *      2.instanceof来做排它性校验
 *          引用 instanceof 类名/接口名
 *          用来判断引用指向的对象是否是后面类名的对象或者子类对象
 *          (如果后面写的是抽象类或者接口,那么判断是否是抽象类/接口的子类对象)
 *          如果引用是一个null,那么该结构永远返回false
 *
 *          这种排它性校验,允许方法传入子类对象
 *          这里就没有getClass要求严格了
 *
 * 以上两种方式,getClass是最常用的
 * 建议默认情况下,无特殊需求时,使用getClass
 * 有特殊情况,可以用instanceof判断.
 *
 * @since 14:23
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        Dog d = new Dog(1000);
        DogSon d2 = new DogSon(1000);
        System.out.println(d.equals(d2));
        System.out.println(d2.equals(d));
    }
}

class Dog {
    int price;

    public Dog(int price) {
        this.price = price;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        /*if (obj == null || this.getClass() != obj.getClass()) {
            return false;
        }*/
        // 使用instanceof做排它性校验
        if (!(obj instanceof Dog)){
            // 不是Dog类型对象,也不是Dog的子类对象
            return false;
       }
        return this.price == ((Dog) obj).price;
    }
}

class DogSon extends Dog {
    public DogSon(int price) {
        super(price);
    }
}